package jsu.ljy.lostandfind.util;

import javax.sql.DataSource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import org.springframework.core.io.ClassPathResource;
import java.util.Properties;

/**
 * 数据库工具类
 * 
 * <p>提供数据库连接的工具方法，管理数据库连接池和连接的获取。
 * 使用HikariCP连接池确保高性能和连接的有效管理。</p>
 * 
 * @author 罗嘉毅
 * @version 1.0
 * @since 2024-03-21
 */
public class DBUtil {
    private static HikariDataSource dataSource;

    /**
     * 私有构造函数，防止实例化
     */
    private DBUtil() {}

    /**
     * 获取数据库连接
     * 
     * @return 数据库连接
     * @throws SQLException 当获取连接失败时抛出
     */
    public static Connection getConnection() throws SQLException {
        if (dataSource == null) {
            initDataSource();
        }
        return dataSource.getConnection();
    }

    /**
     * 初始化数据源
     * 
     * @throws RuntimeException 当初始化数据源失败时抛出
     */
    private static synchronized void initDataSource() {
        try {
            Properties props = new Properties();
            props.load(new ClassPathResource("application.properties").getInputStream());

            HikariConfig config = new HikariConfig();
            config.setJdbcUrl(props.getProperty("spring.datasource.url"));
            config.setUsername(props.getProperty("spring.datasource.username"));
            config.setPassword(props.getProperty("spring.datasource.password"));
            config.setDriverClassName(props.getProperty("spring.datasource.driver-class-name"));
            
            // 连接池配置
            config.setMaximumPoolSize(10);
            config.setMinimumIdle(5);
            config.setIdleTimeout(300000);
            config.setConnectionTimeout(20000);
            
            dataSource = new HikariDataSource(config);
        } catch (Exception e) {
            throw new RuntimeException("初始化数据源失败", e);
        }
    }
} 